package com.mlh.hash;

import java.util.HashSet;
import java.util.Set;

//编写一个算法来判断一个数 n 是不是快乐数。
//「快乐数」 定义为：
//对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
//然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
//如果这个过程 结果为 1，那么这个数就是快乐数。
//如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
//输入：n = 19
//输出：true
//解释：
//12 + 92 = 82
//82 + 22 = 68
//62 + 82 = 100
//12 + 02 + 02 = 1
public class IsHappy {
	public static void main(String[] args) {
		System.out.println(methodAuxiliary(444));
	}

	//利用hashset来判断是否进入循环
	public static boolean method1(int n){
		Set<Integer> set = new HashSet<>();
		while(n!=1){
			if(set.contains(n)){
				return false;
			}
			set.add(n);
			n=methodAuxiliary(n);
		}
		return true;
	}
	//利用快慢指针
	public static boolean method2(int n){
		int slow=n;
		int quick=methodAuxiliary(n);
		while (slow!=quick&&quick!=1){
			slow=methodAuxiliary(slow);
			quick=methodAuxiliary(methodAuxiliary(quick));
		}
		if(quick==1){
			return true;
		}else {
			return false;
		}
	}


	//编写一个方法来返回一个数的各个位数的平方和的值
	//这个方法写的太笨了
	public static int methodAuxiliary(int n){
		int digit=0;
		int res=0;
		while(n/Math.pow(10,digit)!=0){
			digit++;
			double a=Math.pow(10,digit);
			int b=(int)(n%a/(a/10));
			res+=(int)Math.pow(b,2);
		}
		return res;
	}

	//从leetcode上学习过来的方法
	public static int methodAuxiliary2(int n){
		int res=0;
		while(n>0){
			int a=n%10;
			res+=a*a;
			n/=10;
		}
		return res;
	}

}
